package Java.Lock;

//Lock的应用手动上锁和解锁

//第一步  创建资源类，定义属性和操作方法

import java.util.concurrent.locks.ReentrantLock;

class LTiket {
    //飘数量
    private int number = 30;
    //可重入锁
    //fair=false非公平锁，出现线程饿死的情况，优点效率高
    // fair=true，表示该锁是公平锁，不会出现进程饿死情况，缺点效率低
    private final ReentrantLock look = new ReentrantLock(true);

    //卖票方法
    public void sale() {
        //上锁
        look.lock();
        try {
            if (number > 0) {
                System.out.println(Thread.currentThread().getName() + " 卖出： " + (number--) + "剩余：" + number);
            }
        } finally {
            //解锁
            look.unlock();

        }


    }
}

public class LsaleTicket {
    //第二步   创建等多个线程，调用资源类的方法


    public static void main(String[] args) {
        LTiket tiket = new LTiket();

        //lambda表达式创建线程
        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                tiket.sale();
            }
        }, "AA").start();

        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                tiket.sale();
            }
        }, "BB").start();


        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                tiket.sale();
            }
        }, "CC").start();

    }

}
